#include <typescommon.h>
#include <genrand.h>
#include <pthread.h>
// 提前介绍linux的pthread多线程。因为数据结构在多线程需要锁。在clearn.v2.002.07也有用到。
// 被锁住的过程，不要return等退出。否则会死锁。
// 锁过程要短。
// 尽量不要锁内还有锁。
// locka lockb unlocka unlockb可能死锁。
// locka lockb unlockb unlocka到没问题。
static int globalValue = 0;
static pthread_mutex_t globalMutex;// = PTHREAD_MUTEX_INITIALIZER;可以通过PTHREAD_MUTEX_INITIALIZER直接初始化

#define USE_LOCK_FOR_CHANGE_VALUE 0
#define MUTEX_CHECK_COUNT 1000
void *functionThread(void *vp)
{
    while(globalValue < MUTEX_CHECK_COUNT)
    {
        #if USE_LOCK_FOR_CHANGE_VALUE
        pthread_mutex_lock(&globalMutex);//锁
        #endif
        logdebug("%s, value=%d", __func__, globalValue++);
        #if USE_LOCK_FOR_CHANGE_VALUE
        pthread_mutex_unlock(&globalMutex);//解锁
        #endif
    }
    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t tmpfd;
    pthread_mutex_init(&globalMutex, NULL);//初始化互斥锁。-用PTHREAD_MUTEX_INITIALIZER也可以直接初始化。
    pthread_create(&tmpfd, NULL, functionThread, NULL);
    while(globalValue < MUTEX_CHECK_COUNT)
    {
        #if USE_LOCK_FOR_CHANGE_VALUE
        pthread_mutex_lock(&globalMutex);//锁
        #endif
        logdebug("%s, value=%d", __func__, globalValue++);
        #if USE_LOCK_FOR_CHANGE_VALUE
        pthread_mutex_unlock(&globalMutex);//解锁
        #endif
    }
    pthread_join(tmpfd, NULL);//等待子线程结束。
    pthread_mutex_destroy(&globalMutex);//释放锁。
    return 1;
}

// 不用锁就会有2线程数据不一致情况。用valotile没有用的。
// [2023-12-13 15:52:03.269][dbg][cthread.c,18]functionThread, value=897
// [2023-12-13 15:52:03.298][dbg][cthread.c,18]functionThread, value=898
// [2023-12-13 15:52:03.870][dbg][cthread.c,36]main, value=111
// [2023-12-13 15:52:03.337][dbg][cthread.c,36]main, value=899
// [2023-12-13 15:52:03.348][dbg][cthread.c,36]main, value=900
